package com.task.controller.trusteeship;

import com.task.controller.annotation.Function;
import com.task.controller.annotation.impl.TaskImpl;
import com.task.controller.manager.impl.AsyncMethodManager;
import com.task.controller.manager.impl.CurrentMethodManager;
import com.task.controller.manager.impl.UIMethodManager;

import java.lang.reflect.Method;

/**
 * 由于Ability、AbilitySlice等均为系统组件，均由Harmony Ability框架管理，因此此框架设计时，对此类Ability框架管理的对象不做过多的干涉与管理，
 * 因此，若想要在Ability框架的组件中使用此任务调度器，则需要扩展此接口，在开发者认为何时的位置，调用此接口注册于注销即可
 */
public interface TaskRegister {

    /**
     * 调用此方法，注册开放被远程调度的方法
     *
     * @param o 被开放的方法的调用对象
     */
    default void registerTask(Object o) {
        TaskImpl.initTask(o);
    }

    /**
     * 调用此方法，注销已经被开放的方法等同于关闭开放给远程的接口
     *
     * @param o 触发资源的对象
     */
    default void unregister(Object o) {
        Class<?> aClass = o.getClass();
        Method[] methods = aClass.getDeclaredMethods();
        for (Method method : methods) {
            Function function = method.getDeclaredAnnotation(Function.class);
            if (function == null) {
                continue;
            }
            String resource = function.value();
            if (AsyncMethodManager.getInstance().containsKey(resource)) {
                AsyncMethodManager.getInstance().unregister(resource);
            } else if (CurrentMethodManager.getInstance().containsKey(resource)) {
                CurrentMethodManager.getInstance().unregister(resource);
            } else if (UIMethodManager.getInstance().containsKey(resource)) {
                UIMethodManager.getInstance().unregister(resource);
            }
        }
    }
}
